<?php
/**
 * 十一选五开奖。 中奖不在这里
 */
defined('IN_YuLin') || exit('NO PERMIT!');
require_once (ROOT_PATH.'module/lottery/script_common.inc.php');
$beginTime = time();
// 检查脚本执行时间是否在开奖期间
if ($beginTime < strtotime(date('Y-m-d ') . '09:00:00') || $beginTime > strtotime(date('Y-m-d ') . '22:55:00')) return;
$logFile   = '/www/wwwroot/one.qipai101.com/crontab/log/';
echo '<pre>';
// 获取十一选五需要计算开奖的所有彩种信息
$creditPlayTab = Table('lottery_credit_play');
$lottTab       = Table('lottery');
$cateTab       = Table('lottery_category');
$qihaoTab      = Table('lottery_k3');
// 获取当前 十一选五需要计算的彩种
$sql = 'SELECT lott.`id`, lott.`title`, lott.`credit`, play.`open_param`, play.`type_id` FROM ' . $creditPlayTab . ' AS play
        LEFT JOIN ' . $lottTab . ' AS lott
        ON play.`lott_id` = lott.`id`
        LEFT JOIN ' . $cateTab . ' AS cate
        ON cate.`id` = lott.`cate_id`
        WHERE cate.`sname` = "syxw" AND lott.`credit` = 1 AND play.status = 1';
$lottList       = $db->getall($sql);
foreach ($lottList as $lk => $lv){
    // 获取当前彩种的期号信息， 准备计算
    $sql    = 'SELECT id, tid, period, starttime, stoptime, day, opentime, `code` FROM ' . $qihaoTab . ' WHERE tid = ' . $lv['id'] . ' AND stoptime < ' . $beginTime. ' ORDER BY starttime DESC limit 1';
    $qihaoInfo = $db->getrow($sql);
    // 如果已开奖，则跳过
    if ($qihaoInfo['code'] || !$qihaoInfo || $qihaoInfo['stoptime'] > $beginTime) continue;
    if ($lv['type_id'] == 2){
        // 获取指定彩种上一期的开彩号码
        $shangqiSql    = 'SELECT `code` FROM ' . $qihaoTab . ' WHERE tid = ' . trim($lv['open_param']) . ' AND `code` != "" ORDER BY starttime DESC limit 1';
        $shangqiInfo   = $db->getrow($shangqiSql);
        if (!$shangqiInfo['code'] || !$shangqiInfo) break;
    
        $rd       = rand(1, 11);
        $lastCode = explode(',', $shangqiInfo['code']);
        $tmpCode  = array();
        foreach ($lastCode as $lk => $lv){
            $lv   = substr(intval($lv * $rd), -1);
            // 计算结果时出现    6*5  or  5*6  结果等于0，  然后开奖号中，该位置就一直是0了， 这里补偿判断
            if (!$lv) $lv = rand(1, 11);
            while($lv > 11){
                $lv = $lv - 9;
            }
            if ($lv < 10) $lv = '0' . $lv;
            array_push($tmpCode, $lv);
        }
        setOpenCode($qihaoInfo['id'], implode(',', $tmpCode), $db);
        // 计算完毕，跳过下面
        continue;
    }
    
    // 获取当前期号后， 根据期号的id来获取所有当前彩种期号的投注项
    $allBetSql = 'SELECT betting_no, en_play, betting_str, num, multiple, odds, money_unit, eo_money FROM ' . Table('lottery_order_item') . ' WHERE period_id = ' . $qihaoInfo['id'];
    $allBetList        = $db->getall($allBetSql);
    // 计算总投注金额
    $betAmountSql = 'SELECT sum(money) as bet_amount FROM ' . Table('lottery_order_item') . ' WHERE period_id = ' . $qihaoInfo['id'];
    $betAmount    = $db->getrow($betAmountSql);
    // 总投注 * 后台设置百分比（intval后成整数了） * 0.01
    $winnerMax    = $betAmount['bet_amount'] * intval($lv['open_param']) * 0.01;
    // ==========================================================================================================
    // ========================== 计算开奖部分 ===================================================================
    // 投注总金额小于10000， 则随机计算一个都不中奖的号码
    $arr   = range(1, 11);
    shuffle($arr);
    if ($betAmount['bet_amount'] < 10000 || !$allBetList || empty($allBetList)){
        // 投注金额太少，直接随机一个开奖号码
        $openCode = array_slice($arr, 0, 5);
        // 开奖号码补零操作
        foreach ($openCode as $tk => $tv){
            if ($tv < 10){
                $openCode[$tk] = '0' . $tv;
            }
        }
        setOpenCode($qihaoInfo['id'], implode(',', $openCode), $db);
        echo 'success';
        continue;
    }
    
    // 创建所有开奖可能的中奖关系数组
    $openCodeWinner = array();
    // 所有开奖可能的容器
    $comb           = array();
    // 获取到开奖的所有可能
    get_combinations($arr, $comb);
    // 根据每个开奖号进行计算
    foreach ($comb as $k => $v){
        $index = 0;
        $winnerAmount = 0;
        // 打乱顺序
        shuffle($v);
        foreach ($allBetList as $bk => $bv){
            $flag = checkZhongjiang($bv, $v);
            if ($flag){
                $index++;
                // 当前投注中奖金额
                $tmpWinner     = $bv['num'] * $bv['multiple'] * $bv['odds'] * $bv['money_unit'] * $bv['eo_money'];
                // 当前投注号中奖金额累加
                $winnerAmount += $tmpWinner;
            }
        }
        // 开奖号码补零操作
        foreach ($v as $tk => $tv){
            if ($tv < 10){
                $v[$tk] = '0' . $tv;
            }
        }
        $openCodeWinner[implode(',', $v)] = $winnerAmount;
    }
    
    // 模拟的中奖结果排序，降序，对比最接近设定的中奖值
    arsort($openCodeWinner);
    $setStatus = 0;
    $tmpCode   = '';
    $openCodeWinnerMax = 0;
    foreach ($openCodeWinner as $ok => $ov){
        if (!$openCodeWinnerMax){
            $openCodeWinnerMax = 'period:' . $ok . ' winner:' . $ov;
        }
        if ($ov < $winnerMax) {
            $setStatus = 1;
            $tmpCode   = implode(',', $ok);
            setOpenCode($qihaoInfo['id'], $tmpCode, $db);
            break;
        }
    }
    if (!$setStatus){
        // 如果所有号码投注返奖都比设定值大， 那么用最少中奖的开奖号码写进去。（理论上不会运气这么棒，走到这里来）$ok 为上面循环结束后的最后一次赋值，最少中奖开奖号码
        setOpenCode($qihaoInfo['id'], $ok, $db);
    }
    print_r($openCodeWinner);
//     openCodeLog($logFile, 'dfk3_open_log_' . date('ymd') . '.txt', $lotStr);
}

echo 'end【总耗时:' . (time() - $beginTime) . '】  开奖期号：【' . $db . '】';
exit;







/**
 * 检查投注项是否中奖
 * @param $data : 投注内容
 * @param $kaijiang : 开奖结果
 * @param $db   : 数据库连接对象
 */
function checkZhongjiang($data, $openCode){
    $flag = false;
    $betArr = explode(',', $data['betting_no']);
    switch ($data['en_play']){
        case 'SM-QS_ZHI_XFS':
            // 三码玩法：前三直选复式【与开奖数据前三位完全一致即为中奖】
        case 'SM-QS_ZHI_XDS':
            // 三码玩法：前三直选单式
            if($betArr[0] == $openCode[0] && $betArr[1] == $openCode[1] && $betArr[2] == $openCode[2]){
                // 恭喜中奖
                $flag = true;
            }
            break;
        case 'SM-QS_ZU_XFS':
            // 三码玩法：前三组选复式【与开奖数据前三包含投注号即中奖，不限顺序】
        case 'SM-QS_ZU_XDS':
            // 三码玩法：前三组选单式【与开奖数据前三包含投注号即中奖，不限顺序】
            $tmp = array_shift(array_chunk($openCode, 3));
            if (in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)){
                $flag = true;
            }
            break;
        case 'SM-QS_ZU_XDT':
            // 三码玩法：前三组选胆拖【开奖前三个数与投注数一样，顺序不要求，  且胆码必须全中】
            $tmp = array_shift(array_chunk($openCode, 3));
            // 检查有多少胆码， 一个胆码与两个胆码的中奖计算不一样
            $bettingDan = array_filter(explode(' ', array_shift(explode(',', $data['betting_str']))));
            if (count($bettingDan) == 1 ){
                // 一胆二拖
                if (in_array($bettingDan[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)){
                    $flag = true;
                }
            }else{
                // 二胆一拖
                if(in_array($bettingDan[0], $tmp) && in_array($bettingDan[1], $tmp) && in_array($betArr[2], $tmp)){
                    $flag = true;
                }
            }
            break;
        case 'EM-QE_ZHI_XFS':
            // 二码玩法：前二直选复式
        case 'EM-QE_ZHI_XDS':
            // 二码玩法：前二直选单式
            $tmp = array_shift(array_chunk($openCode, 2));
            if ($betArr[0] ==  $tmp[0] && $betArr[1] ==  $tmp[1]){
                $flag = true;
            }
            break;
        case 'EM-QE_ZU_XFS':
            // 二码玩法：前二组选复式【投注的两个号码，在开奖前两个号码中，且不限顺序即中奖】
        case 'EM-QE_ZU_XDS':
            // 二码玩法：前二组选单式【投注的两个号码，在开奖前两个号码中，且不限顺序即中奖】
        case 'EM-QE_ZU_XDT':
            // 二码玩法：前二组选胆拖【投注的两个号码，在开奖前两个号码中，且不限顺序即中奖】
            $tmp = array_shift(array_chunk($openCode, 2));
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp)){
                $flag = true;
            }
            break;
        case 'BDW-QSYMBDW':
            // 不定位：前三一码不定位【开奖前三个号码包含投注项即为中奖】
            $tmp = array_shift(array_chunk($openCode, 3));
            if(in_array($betArr[0], $tmp)){
                $flag = true;
            }
            break;
        case 'DWD-FS':
            // 定位胆：复式【投注号的位置与开奖号对应位置的号码相同，即为中奖】
            $tmp = array_shift(array_chunk($openCode, 3));
            if($betArr[0] == $tmp[0] || $betArr[1] == $tmp[1] || $betArr[2] == $tmp[2] ){
                $flag = true;
            }
            break;
        case 'QWX-DDS':
            // 趣味型：定单双【开奖数的单双数判断】
            $tmp  = $openCode;
            // 计算开奖号的单数值数量
            $nums = 0;
            foreach ($tmp as $k => $v){
                if ($v % 2){
                    $nums++;
                }
            }
            // 截取投注号第一个数值
            $betArr1 = intval($betArr[0]);
            if ($nums == $betArr1){
                $flag = true;
                // 赔率根据投注内容浮动
                switch ($nums){
                    case '0':
                        $update['odds']   = '900.90';
                        break;
                    case '1':
                        $update['odds'] = '30.03';
                        break;
                    case '2':
                        $update['odds'] = '6.00';
                        break;
                    case '3':
                        $update['odds'] = '6.00';
                        break;
                    case '4':
                        $update['odds'] = '12.01';
                        break;
                    case '5':
                        $update['odds'] = '150.15';
                        break;
                }
                $update['remark'] = $betArr[0] . ' 赔率为' . $update['odds'];
            }
            break;
        case 'QWX-CZW':
            // 趣味型：猜中位【开奖号码排序后取中间的一位对比投注号，如果相同则中奖】
            $tmp  = $openCode;
            sort($tmp);
            if($betArr[0] == $tmp[2]) {
                $flag = true;
                switch ($nums){
                    case '3':
                        $update['odds'] = '32.17';
                        break;
                    case '9':
                        $update['odds'] = '32.17';
                        break;
                    case '4':
                        $update['odds'] = '14.30';
                        break;
                    case '8':
                        $update['odds'] = '14.30';
                        break;
                    case '5':
                        $update['odds'] = '10.01';
                        break;
                    case '7':
                        $update['odds'] = '10.01';
                        break;
                    case '6':
                        $update['odds'] = '9.00';
                        break;
                }
                $update['remark'] = $betArr[0] . ' 赔率为' . $update['odds'];
            }
            break;
        case 'RXDS-YZY':
            // 任选单式：一中一【开奖数包含投注的一个号码即为中奖】
        case 'RXFS-YZY':
            // 任选复式：一中一【开奖数包含投注的一个号码即为中奖】
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDS-EZE':
            // 任选单式：二中二
        case 'RXFS-EZE':
            // 任选复式：二中二
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDS-SZS':
            // 任选单式：三中三
        case 'RXFS-SZS':
            // 任选复式：三中三
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDS-SI_Z_SI':
            // 任选单式：四中四
        case 'RXFS-SI_Z_SI':
            // 任选复式：四中四
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                  && in_array($betArr[3], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDS-WZW':
            // 任选单式：五中五
        case 'RXFS-WZW':
            // 任选复式：五中五
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                 && in_array($betArr[3], $tmp) && in_array($betArr[4], $tmp)){
                    $flag = true;
            }
            break;
        case 'RXDS-LZW':
            // 任选单式：六中五
        case 'RXFS-LZW':
            // 任选复式：六中五
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                 && in_array($betArr[3], $tmp) && in_array($betArr[4], $tmp) && in_array($betArr[5], $tmp)){
                    $flag = true;
            }
            break;
        case 'RXDS-QZW':
            // 任选单式：七中五
        case 'RXFS-QZW':
            // 任选复式：七中五
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                 && in_array($betArr[3], $tmp) && in_array($betArr[4], $tmp) && in_array($betArr[5], $tmp)
                 && in_array($betArr[6], $tmp)){
                    $flag = true;
            }
            break;
        case 'RXDS-BZW':
            // 任选单式：八中五
        case 'RXFS-BZW':
            // 任选复式：八中五
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                && in_array($betArr[3], $tmp) && in_array($betArr[4], $tmp) && in_array($betArr[5], $tmp)
                && in_array($betArr[6], $tmp) && in_array($betArr[7], $tmp)){
                    $flag = true;
            }
            break;
        case 'RXDT-EZE':
            // 任选胆拖：二中二 【胆码必须是开奖号码，所选两个号码在开奖号码中】
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDT-SZS':
            // 任选胆拖：三中三 【胆码必须是开奖号码，所选三个号码在开奖号码中】
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDT-SI_Z_SI':
            // 任选胆拖：四中四 【胆码必须是开奖号码，所选四个号码在开奖号码中】
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                 && in_array($betArr[3], $tmp)){
                $flag = true;
            }
            break;
        case 'RXDT-WZW':
            // 任选胆拖：五中五 【胆码必须是开奖号码，所选五个号码在开奖号码中】
            $tmp  = $openCode;
            if(in_array($betArr[0], $tmp) && in_array($betArr[1], $tmp) && in_array($betArr[2], $tmp)
                && in_array($betArr[3], $tmp) && in_array($betArr[4], $tmp)){
                    $flag = true;
            }
            break;
        case 'RXDT-LZW':
            // 任选胆拖：六中五 【胆码必须是开奖号码，所选六个号码有五个在开奖号码中】
            $tmp   = $openCode;
            $index = 0;
            if (in_array($betArr[0], $tmp)) $index++;
            if (in_array($betArr[1], $tmp)) $index++;
            if (in_array($betArr[2], $tmp)) $index++;
            if (in_array($betArr[3], $tmp)) $index++;
            if (in_array($betArr[4], $tmp)) $index++;
            if (in_array($betArr[5], $tmp)) $index++;
            if($index == 5){
                $flag = true;
            }
            break;
        case 'RXDT-QZW':
            // 任选胆拖：七中五 【胆码必须是开奖号码，所选七个号码有五个在开奖号码中】
            $tmp  = $openCode;
            if (in_array($betArr[0], $tmp)) $index++;
            if (in_array($betArr[1], $tmp)) $index++;
            if (in_array($betArr[2], $tmp)) $index++;
            if (in_array($betArr[3], $tmp)) $index++;
            if (in_array($betArr[4], $tmp)) $index++;
            if (in_array($betArr[5], $tmp)) $index++;
            if (in_array($betArr[6], $tmp)) $index++;
            if($index == 5){
                $flag = true;
            }
            break;
        case 'RXDT-BZW':
            // 任选胆拖：八中五 【胆码必须是开奖号码，所选八个号码有五个在开奖号码中】
            $tmp  = $openCode;
            if (in_array($betArr[0], $tmp)) $index++;
            if (in_array($betArr[1], $tmp)) $index++;
            if (in_array($betArr[2], $tmp)) $index++;
            if (in_array($betArr[3], $tmp)) $index++;
            if (in_array($betArr[4], $tmp)) $index++;
            if (in_array($betArr[5], $tmp)) $index++;
            if (in_array($betArr[6], $tmp)) $index++;
            if (in_array($betArr[7], $tmp)) $index++;
            if($index == 5){
                $flag = true;
            }
            break;
    }
    return $flag;
}




